(function($) {
    /**
     * 文档阅读时长计算（依赖 https://www.jsdelivr.com/package/npm/reading-time）
     *【功能】
     * 1. 区分中英文内容采用不同阅读速度
     * 2. 智能处理元素（代码块、表格、图片等）
     * 3. 显示"全文阅读时长：XX分钟"
     */
    function ReadingTime(options) {
        // 默认配置
        this.config = $.extend({
            contentSelector: '.bd-article',       // 文章内容容器
            outputSelector: '#reading-time-text', // 结果显示元素
            chineseSpeed: 300,                    // 中文阅读速度(字/分钟)
            englishSpeed: 200,                    // 英文阅读速度(词/分钟)
            numbersSpeed: 450,                    // 数字阅读速度(个/分钟)
            codeBlockShort: 5,                    // 短代码块时间(秒)
            codeBlockMedium: 30,                  // 中代码块时间(秒)
            codeBlockLong: 60,                    // 长代码块时间(秒)
            codeLineThreshold: {                  // 代码行数分级阈值
                short: 10,
                medium: 30
            },
            imageTime: 10,                        // 每张图片阅读时间(秒)
            tableTime: 15,                        // 每个表格阅读时间(秒)
            mathTime: 30,                         // 每个数学公式阅读时间(秒)
            minReadTime: 1,                       // 最小阅读时间(分钟)
            debug: false                          // 调试模式
        }, options);

        // 实例变量
        this.articleTextLength = null;
        this.minutes = null;

        this.init();
    }

    // 原型方法
    ReadingTime.prototype = {
        init: function() {
            const self = this;
            $(function() { self._calculate(); });
        },

        _log: function(message, data=null, level='info') {
            if (!this.config.debug) return;

            const prefix = '[ReadingTime] ';

            switch(level) {
                case 'error': console.error(prefix + message, data || ''); break;
                case 'warn': console.warn(prefix + message, data || ''); break;
                default: console.log(prefix + message, data || '');
            }
        },

        _calculate: function() {
            try {
                const $content = $(this.config.contentSelector);
                if (!$content.length) {
                    this._log('内容元素未找到: ' + this.config.contentSelector, null, 'warn');
                    return;
                }

                // 克隆内容以避免影响原始 DOM
                const $clone = $content.clone();

                // 分析内容类型
                const analysis = this._analyzeContent($clone);
                this._log('内容元素分析结果: ', analysis);

                // 计算总阅读时间
                this.minutes = this._calculateTotalTime(analysis);
                this._log(`阅读时长: ${this.minutes} 分钟`);
            } finally  {
                // 更新显示
                this._updateDisplay(this.minutes);
            }
        },

        _countCodeBlocksByLines: function($element) {
            const self = this; // 保存实例引用
            const blocks = { short: 0, medium: 0, long: 0 };
            const thresholds = this.config.codeLineThreshold;

            $element.find('.highlight pre').each(function() {
                const lineNumbers = $(this).find('.linenos');
                let lines = lineNumbers.length;
                if (lines === 0) {
                    const codeText = $(this).text()
                        .replace(/^\s+|\s+$/g, '')  // 去除首尾空白
                        .replace(/\r\n/g, '\n');    // 统一换行符

                    // 排除空行影响
                    lines = codeText.split('\n')
                        .filter(line => line.trim().length > 0)
                        .length;
                    if (self.config.debug === true) {
                        console.groupCollapsed(`代码块行数: ${lines}`);
                        self._log($(this).html());
                        console.groupEnd();
                    }
                }
                if (lines <= thresholds.short) {
                    blocks.short++;
                } else if (lines <= thresholds.medium) {
                    blocks.medium++;
                } else {
                    blocks.long++;
                }
            });

            // 代码块行数统计后，再去掉行号元素
            $element.find('.linenos').remove()

            return blocks;
        },

        _analyzeContent: function($element) {
            // 移除不需要计算的元素
            this._removeIgnoredElements($element);

            // 统计特殊元素
            return {
                images: $element.find('img, .figure, .figure-img').length,
                tables: $element.find('table').length,
                codeBlocks: this._countCodeBlocksByLines($element),
                mathElements: $element.find('.math, .arithmatex').length,
                text: this._getTextContent($element)
            };
        },

        _calculateTotalTime: function(analysis) {
            // 分析中英文比例
            const langAnalysis = this._analyzeLanguage(analysis.text);
            // 总字数
            this.articleTextLength = langAnalysis.totalChars;
            this._log('字符统计:', langAnalysis);

            // 计算文本数字阅读时间(秒)
            const textTime =
                (langAnalysis.chineseChars / this.config.chineseSpeed * 60) +
                (langAnalysis.englishWords / this.config.englishSpeed * 60) +
                (langAnalysis.numberChars / this.config.numbersSpeed * 60);

            // 计算代码块阅读时间(秒)
            const codeTime =
                (analysis.codeBlocks.short * this.config.codeBlockShort) +
                (analysis.codeBlocks.medium * this.config.codeBlockMedium) +
                (analysis.codeBlocks.long * this.config.codeBlockLong);

            // 计算其他元素阅读时间(秒)
            const extraTime =
                (analysis.images * this.config.imageTime) +
                (analysis.tables * this.config.tableTime) +
                (analysis.mathElements * this.config.mathTime);

            // 总时间转换为分钟
            return Math.max(
                this.config.minReadTime,
                Math.ceil((textTime + codeTime + extraTime) / 60)
            );
        },

        _updateDisplay: function(minutes) {
            const $output = $(this.config.outputSelector);
            if (!minutes || !$output.length) {
                this._log('输出元素未找到: ' + this.config.outputSelector, null, 'warn');
                $(this.config.outputSelector).text('在知识的星海中，时间只是参考坐标');
                return;
            }

            $output.text(`全文阅读时长：${minutes}分钟`).attr('title', `字数个数: ${this.articleTextLength}`);
        },

        _removeIgnoredElements: function($element) {
            // 去掉代码块复制按钮
            $element.find('.highlight .copybtn').remove();
        },

        _getTextContent: function($element) {
            // 简化数学公式
            $element.find('.math, .arithmatex').text('x');
            // 简化代码块文件名
            $element.find('.caption-text').text('F');
            // 简化链接为一个字符（排除单个 # 的链接）
            $element.find('a').each(function() {
                if ($(this).text().trim() !== '#') {
                    $(this).text('L'); // L 代表 Link
                }
            });

             // \s 匹配任意空白字符，这里替换为空格，保留单词边界
            return $element.text().replace(/[\s#-]+/g, ' ').trim() || ' ';
        },

        _analyzeLanguage: function(text) {
            // 移除所有空白字符
            const cleanText = text.replace(/\s+/g, '');
            // 中文字符统计
            const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
            // 数字统计
            const numberChars = (text.replace(/[\u4e00-\u9fa5a-zA-Z]/g, ' ')
                    .match(/\b[0-9.]+\b/g) || []).length // \b 匹配连续数字
            // 英文单词统计（仅包含字母的连续字符）
            const englishWords = (text.replace(/[\u4e00-\u9fa50-9.]/g, ' ')
                    .match(/\b[a-zA-Z]+\b/g) || []).length // \b 匹配单词边界，确保是完整单词
            // 英文字符统计
            const englishChars = (text.replace(/[\u4e00-\u9fa5]/g, '')
                    .match(/[a-zA-Z]/g) || []).length
            // 统计其他字符（总字符数 - 中文 - 数字 - 英文字符），并确保不为负数
            const otherChars =  Math.max(
                0,
                cleanText.length - chineseChars - numberChars - englishChars);

            return {
                originChars: text.length,
                cleanChars: cleanText.length,
                chineseChars,
                englishWords,
                englishChars,
                numberChars,
                otherChars,
                totalChars: chineseChars + englishWords +  numberChars
            };
        },

        // 公共方法
        refresh: function() {
            this._calculate();
        }
    };

    // 自动初始化
    $(function() {
        window.ReadingTime = new ReadingTime();
        // new ReadingTime();
    });
})(jQuery);